package com.example.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import com.example.pojo.User;
import com.example.service.UserService;
import com.example.utils.JWTUtil;
import com.example.utils.Md5Util;
import com.example.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.time.Instant;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Description TODO
 * @Author fantasy
 * @Date 2024/6/26 22:09
 **/
@Validated
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
 * 处理用户注册请求。
 * <p>
 * 通过POST请求向此路径发送用户注册信息，包括用户名和密码。在注册之前，会检查用户名和密码的格式是否符合要求，
 * 然后检查用户名是否已被占用。如果一切检查通过，用户将被成功注册。
 *
 * @param json
 * @return 如果注册成功，返回一个表示成功的Result对象；如果用户名已存在，返回一个表示错误的Result对象，其中包含错误信息。
 */
@PostMapping("/register")
public Result register(@RequestBody JSONObject json){
    String username = json.getString("username");
    String password = json.getString("password");
    // 根据用户名查找已存在的用户
    User user = userService.findByUsername(username);
    // 如果用户已存在，返回错误信息
    if (user != null){
        return Result.error("用户名已存在");
    }
    // 注册新用户
    userService.register(username, password);
    // 注册成功，返回成功信息
    return Result.success();
}

    @PostMapping("/login")
    public Result login(@RequestBody JSONObject u){
        String username = u.getString("username");
        String password = u.getString("password");
        User user = userService.findByUsername(username);
        if (user == null){
            return Result.error("用户名不存在");
        }
        if (user.getActive() != 1){
            return Result.error("用户已被禁用");
        }
        if (!user.getPassword().equals(Md5Util.md5Encrypt(password))){
            return Result.error("用户名或密码错误");
        }
        String token = JWTUtil.genJwt(Map.of("id", user.getId(), "username", user.getUsername()));
        return Result.success(token);
    }

    /*@GetMapping("/userInfo")
    public Result<User> getUserInfo(@RequestHeader(value = "token", required = true) String key){
        Map<String, Object> map = JWTUtil.verifyJwt(key);
        User user = userService.findByUsername(map.get("username").toString());
        return Result.success(user);
    }*/
    @GetMapping("/userInfo")
    public Result<User> getUserInfo(){
        Map<String, Object> o = ThreadLocalUtil.get();
        User user = userService.findByUsername(o.get("username").toString());
        String pic = user.getUserPic();
        File file;
        try {
            file = new File("D:\\studyJava\\ideaProject\\springboot-aliyun-start\\big-event\\uploadfile\\" + pic);
            FileInputStream fis = new FileInputStream(file);
            byte[] bytes = new byte[fis.available()];
            fis.read(bytes);
            user.setUserPic(new String(bytes));
            fis.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return Result.success(user);
    }
    /**
     * 通过PUT请求更新用户信息。
     *
     * @param user 包含待更新用户信息的请求体。
     * @return 返回操作结果，如果更新成功，则返回成功的标志。
     */
    @PutMapping("/update")
    public Result update(@RequestBody User user){
        userService.update(user);
        return Result.success();
    }

    /**
     * 更新用户头像的接口。
     *
     * 通过此接口，用户可以更新他们的头像URL。此操作仅涉及存储头像URL的更新，
     * 不涉及实际头像图片的上传或处理。实际的头像更新逻辑由userService中的updateAvatar方法处理。
     *
     * @param object 用户新的头像URL，必须是一个有效的URL。
     * @return 返回操作结果，如果操作成功，则返回一个表示成功的Result对象。
     */
    @PostMapping("/avatar")
    public Result updateAvatar(@RequestBody JSONObject object){
        String avatar = object.getString("avatar");
        String string = getRandomString(10)+ Instant.now().getEpochSecond();
        File file;
        try {
            file = new File("D:\\studyJava\\ideaProject\\springboot-aliyun-start\\big-event\\uploadfile\\" + string + ".png");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(avatar.getBytes());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        userService.updateAvatar(file.getName());
        return Result.success();
    }
    private String getRandomString(int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(characters.length());
            sb.append(characters.charAt(index));
        }
        return sb.toString();
    }
    @PostMapping("/passwd")
    public Result updatePasswd(@RequestBody JSONObject json){
        String oldPasswd = json.getString("password");
        Map<String, Object> o = ThreadLocalUtil.get();
        Integer id = (Integer) o.get("id");
        User user = userService.getUserById(id);
        if (!user.getPassword().equals(Md5Util.md5Encrypt(oldPasswd))){
            return Result.error("旧密码错误");
        }
        String j = json.getString("newPassword");
        userService.updatePasswd(Md5Util.md5Encrypt(j),id);
        return Result.success();
    }

    /*
    * 获取用户文章的分类情况
    * */
    @GetMapping("/article")
    public Result<List> getArticleInfo(){
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");
        List articleInfo = userService.getArticleInfo(id);
        return Result.success(articleInfo);
    }

    /*
    * 获取用户文章发布每日发布情况
    *
    * */
    @GetMapping("/dayInfo")
    public Result<List> getDayInfo(){
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");
        List dayInfo = userService.getDayInfo(id);
        return Result.success(dayInfo);
    }

    @RequestMapping("/getFrined")
    public Result<List> getFriend(){
        Map<String, Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        HashMap map1 = new HashMap();
        map1.put("username",username);
        map1.put("active","1");
        List<User> friends = userService.getUserFriend(map1);
        return Result.success(friends);
    }
}
